import 'dart:convert';

import 'package:shared_preferences/shared_preferences.dart';

import 'persistentor.dart';

//sharePreference 的持久化封装
class SpPersistentor implements Persistentor{

  @override
  Future<bool> clear() async{
    SharedPreferences prefs = await SharedPreferences.getInstance();
    return prefs.clear();
  }

  @override
  Future<Set<String>> getKeys() async{
    SharedPreferences prefs = await SharedPreferences.getInstance();
    return prefs.getKeys();
  }

  @override
  Future<dynamic> getStorage(String key) async{
    SharedPreferences prefs = await SharedPreferences.getInstance();
    // 获取key对应的value
    dynamic value= prefs.get(key);
    // 判断value是不是一个json的字符串 是 则解码
    if(_isJson(value)){
      return JsonDecoder().convert(value);
    }else{
      // 不是 则直接返回
      return value;
    }
  }

  @override
  Future<bool> hasKey(String key) async{
    SharedPreferences prefs = await SharedPreferences.getInstance();
    return prefs.containsKey(key);
  }

  @override
  Future<bool> removeStorage(String key) async{
    SharedPreferences prefs = await SharedPreferences.getInstance();
    return prefs.remove(key);
  }

  @override
  Future<bool> setStorage(String key, value) async{
    SharedPreferences prefs = await SharedPreferences.getInstance();
    String type;
    // 监测value的类型 如果是Map和List,则转换成JSON，以字符串进行存储
    if(value is Map||value is List){
      type='String';
      value=JsonEncoder().convert(value);
    }else{  // 否则 获取value的类型的字符串形式
      type=value.runtimeType.toString();
    }
    // 根据value不同的类型 用不同的方法进行存储
    switch (type) {
      case 'String':
        return prefs.setString(key, value);
      case 'int':
        return prefs.setInt(key, value);
      case 'double':
        return prefs.setDouble(key, value);
      case 'bool':
        return prefs.setBool(key, value);
      default:
        return prefs.setString(key, value);
    }
  }

  // 判断是否是JSON字符串
  _isJson(dynamic value){
    try{
      // 如果value是一个json的字符串 则不会报错 返回true
      JsonDecoder().convert(value);
      return true;
    }catch(e){
      // 如果value不是json的字符串 则报错 进入catch 返回false
      return false;
    }
  }

}